# -*- coding: utf-8 -*-
import unittest

from pyview import BaseView

class BaseViewTest(unittest.TestCase):
    " Тест Базовой реализации вьюхи "
    
    def __get_data(self, view_class):
        view = view_class()
        view.set_data("data")
        self.assertEqual(view.get_data(), "data")
        
    def __get_mutated_data(self, view_class):
        view = view_class()
        self.assertEqual(view.get_data(), "data mutated")
        
    def test__get_data(self):
        " Получение данных "
        self.__get_data(BaseView)
        
    def test__get_data_inchild(self):
        " Получение данных наследником "
        
        class GenericView(BaseView):
            pass
        
        self.__get_data(GenericView)
    
    def test__get_data_inchild_mutate(self):
        " Получение и изменение данных наследником "
        
        class GenericView(BaseView):
            def __init__(self, *args, **kwargs):
                super(GenericView, self).__init__(*args, **kwargs)
                self.set_data("data mutated")
                
        self.__get_mutated_data(GenericView)
    
    def test__set_accessor(self):
        " Возможность изменение ассесора данных "
        
        class GenericView(BaseView):
            def get_data(self):
                return 'data mutated'

        self.__get_mutated_data(GenericView)

from pyview import ViewFactory

class ViewFactoryTest(unittest.TestCase):
    
    def test__INIT(self):
        """ Инициализация фабрики вьюх """
        factory = ViewFactory()
        
    def test__add_view(self):
        """ Регистрация одной вьюхи """
        factory = ViewFactory()
        factory.add_view('view', BaseView)
        
    def test__add_view(self):
        """ Регистрация одной вьюхи, имя как unicode"""
        factory = ViewFactory()
        factory.add_view(u'юникод', BaseView)    
            
    def test__add_views(self):
        """ Регистрация множдества вьюх """
        factory = ViewFactory()
        factory.add_views({'view' : BaseView, 'another' : BaseView})
        
    def test__add_views_unicode(self):
        """ Регистрация множеста вьюх, имена как unicode """
        factory = ViewFactory()
        factory.add_views({u'вьюха' : BaseView, u'другая' : BaseView})
            
    def test__filed_add_views(self):
        """ Реакция add_views на неверный аргумент `views` (не dict) """
        factory = ViewFactory()
        self.assertRaises(AssertionError, factory.add_views, 'string')
    
    def test__filed_view_name__add_view(self):
        """ Реакция add_view на неверный аргумент `view_name` (не str и не unicode) """
        factory = ViewFactory()
        self.assertRaises(AssertionError, factory.add_view, 123456, BaseView)

    def test__filed_view__add_view(self):
        """ Реакция add_view на неверный аргумент `view` (не наследник BaseView) """
        
        class IAmFakeView(object):
            pass
        
        factory = ViewFactory()
        self.assertRaises(AssertionError, factory.add_view, 'view_name', IAmFakeView)
        
    def test_get_view(self):
        """ Получение вьюва """
        factory = ViewFactory()
        factory.add_view("view_name", BaseView)
        factory.get_view('view_name')
        
    def test_get_view__unicode(self):
        """ Получение вьюва, имя как юникод """
        factory = ViewFactory()
        factory.add_view(u'вьюв', BaseView)
        factory.get_view(u'вьюв')    
        
    def test_filed_view_name__get_view(self):
        
        """ Реакция get_view на неверный параметр `view_name` """
        
        factory = ViewFactory()
        factory.add_view("view_name", BaseView)
        self.assertRaises(AssertionError, factory.get_view, 12345)   
        
    def test_filed_viewdoesnotexist__get_view(self):
        """ Реакция get_view на попытку получить не зарегестрированный вьюв """
        
        from pyview import View
        
        factory = ViewFactory()
        factory.add_view("view_name", BaseView)
        self.assertRaises(View.DoesNotExist, factory.get_view, 'view')
        
    def test_filed_viewdoesnotexist__get_view__unicode(self):
        """ Реакция get_view на попытку получить не зарегестрированный вьюв, имя как юникод """
        
        from pyview import View
        
        factory = ViewFactory()
        factory.add_view("view_name", BaseView)
        self.assertRaises(View.DoesNotExist, factory.get_view, u'вьюф')

from pyview.pylonsv import PylonsView

class PylonsViewTest(unittest.TestCase):
    
    def test_template_path(self):
        """ Формирование пути до темплейта"""
        
        t = PylonsView()
        
        t.template_root = '/templates'
        t.template = 'base.mako'
        self.assertEqual('/templates/base.mako', t._mk_template_path())
        
        t.template_root = 'templates'
        self.assertEqual('templates/base.mako', t._mk_template_path())
        
        t.template_root = '/templates/'
        self.assertEqual('/templates/base.mako', t._mk_template_path())
        
        t.template_root = '/templates/'
        t.template = '/base.mako'
        self.assertEqual('/templates/base.mako', t._mk_template_path())
        
        t.template_root = '/////templates/////'
        t.template = '/////base.mako'
        self.assertEqual('/templates/base.mako', t._mk_template_path())
    
